﻿# -*- coding:utf-8 -*-
#
# Компьютерная техника
#
from django.db import models
from django.contrib.auth.models import User
from django.core.files.storage import default_storage

#Дерево отделов (структуры рабочих мест) SHM
from shm.models import Department, Employee
from task.models import Task


NODE_TYPE_CHOICES = (
    ('standart', 'Стандарт'),
    ('storage', 'Склад'),
    ('out', 'Списанные'),
    ('public', 'Общедоступное'),
)

PARAM_TYPE_CHOICES = (
    ('model', 'Модель'),
    ('device', 'Устройство'),
)


# Фотографии
class Photo(models.Model):
    # Наименование
    title = models.CharField(max_length=64, verbose_name="Наименование")  
    image = models.ImageField(upload_to='files/comp/photo/img/', verbose_name="Файл фотографии")

    class Meta:
        verbose_name = "Фотография"    
        verbose_name_plural = "Фотографии"
    
        
    def __unicode__(self):
        return u"%s" % self.title

# иконки
class Icon(models.Model):
    # Наименование
    title = models.CharField(max_length=64, verbose_name="Наименование")  
    image = models.ImageField(upload_to='files/comp/icon/', verbose_name="Файл Иконки")

    class Meta:
        verbose_name = "Иконка"    
        verbose_name_plural = "Иконки"
        
    def __unicode__(self):
        return u"%s" % self.title




# Производители
class Manufacturer(models.Model):
    
    name = models.CharField(max_length=64, verbose_name="Наименование")  # Наименование
    link = models.URLField(verify_exists=False, verbose_name="Ссылка")   #ссылка 
    note = models.TextField(blank=True, verbose_name="Примечание")  # Примечание

    class Meta:
        verbose_name = "Производитель"    
        verbose_name_plural = "Производители"    
        
    def __unicode__(self):
        return u"%s %s" % (self.name, self.link)




#Сетевые интерфейсы
class NetInterface(models.Model):
    # Наименование
    title = models.CharField(max_length=64, verbose_name="Наименование")    
    
    class Meta:
        verbose_name = "Сетевой интерфейс"
        verbose_name_plural = "Сетевые интерфейсы"        
        
        
    def __unicode__(self):
        return u"%s" % self.title



#Дерево Помещений
class Office(models.Model):
    # Принадлежность (FK)
    parent = models.ForeignKey('self', null=True, blank=True, verbose_name="Принадлежность")
    # Наименование
    title = models.CharField(max_length=64, verbose_name="Наименование")
    # Наименование краткое
    title_short = models.CharField(max_length=64, blank=True, verbose_name="Наименование краткое")
    # Адрес
    address = models.CharField(max_length=64, blank=True, verbose_name="Адрес")
    # Телефон
    phone = models.CharField(max_length=32, blank=True, verbose_name="Телефон")
    # Размеры(Ширина Длинна высота)
    size = models.CharField(max_length=16, blank=True, verbose_name="Размеры")
    # Примечание
    note = models.TextField(blank=True, verbose_name="Примечание")
    # Файл плана 
    map = models.FileField(upload_to='files/comp/office/map/', blank=True, verbose_name="Файл плана")
    # иконка
    icon = models.ForeignKey(Icon, null=True,  blank=True, verbose_name="Иконка")

    class Meta:
        verbose_name = "Помещение"
        verbose_name_plural = "Дерево помещений"        
        
    def __unicode__(self):
        return u"%s" % self.title
        
        
        
# Рабочее место 
class Workstation(models.Model):
    # Наименование
    title = models.CharField(max_length=64, verbose_name="Наименование")
    # Наименование краткое
    title_short = models.CharField(max_length=64, blank=True, verbose_name="Наименование краткое")
    #Дерево Помещений (FK)
    office = models.ForeignKey(Office, verbose_name="Помещения")
    #Дерево Отделов (FK) (необязательное)
    department = models.ForeignKey(Department, null=True,  blank=True, verbose_name="Отдел")
    #Материально-ответственное лицо (FK)
    responsible = models.ForeignKey(Employee, verbose_name='Материально-ответственное лицо',related_name = 'ws_responsible_set')
    #Ответственный пользователь (FK)
    main_user = models.ForeignKey(Employee, verbose_name='Ответственный пользователь',related_name = 'ws_mainuser_set', default=None)
    #Пользователи (FK)
    users = models.ManyToManyField(Employee, verbose_name='Пользователи', related_name = 'ws_users_set', default=None)
    #Сетевые интерфейсы (FK)
    net_interface = models.ForeignKey(NetInterface, null=True,  blank=True, verbose_name="Сетевые интерфейсы")
    #Координаты на плане
    map_position_x = models.IntegerField(blank=True, default=0, verbose_name="Координаты на плане по горизонтали")
    map_position_y = models.IntegerField(blank=True, default=0, verbose_name="Координаты на плане по вертикали") 
    #Телефон
    phone = models.CharField(max_length=32, blank=True, verbose_name="Телефон")
    #фотографии (FK)
    photo = models.ForeignKey(Photo, null=True,  blank=True, verbose_name="Фотографии")
    #фиктивное рабочее место
    virtual = models.BooleanField(verbose_name="фиктивное рабочее место")
    #Тип узла (Стандарт, Склад, Списанные, Общедоступное)
    node_type = models.CharField(max_length=8, choices=NODE_TYPE_CHOICES, verbose_name='Тип узла', default=None)  
      
    class Meta:
        verbose_name = "Рабочее место"
        verbose_name_plural = "Рабочие места"        
        
    def __unicode__(self):
        return u"%s" % self.title
        
 
# Состояния устройств
class DeviceState(models.Model):

    #Наименование
    title = models.CharField(max_length=64, verbose_name="Наименование")
    #Устройство списано
    is_out = models.BooleanField(verbose_name="Устройство списано")
    #Оформление - жирность шрифта
    font_weight = models.CharField(max_length=8, verbose_name="Оформление - жирность шрифта")
    #Оформление - цвет текста
    font_color = models.CharField(max_length=8, verbose_name="Оформление - цвет текста")
    #Оформление - цвет фона
    font_background = models.CharField(max_length=8, verbose_name="Оформление - цвет фона")
    #Примечание
    note = models.TextField(blank=True, verbose_name="Примечание")

    class Meta:
        verbose_name = "Состояния устройств"
        verbose_name_plural = "Состояния устройств"
        
    def __unicode__(self):
        return u"%s" % self.title

       
 
# Тип устройства (дерево)
class ModelType(models.Model):
    #наименование
    title = models.CharField(max_length=64, verbose_name="Наименование")
    #контейнер по умолчанию (FK)
    container = models.ForeignKey('self', null=True, blank=True, related_name = 'mt_container_set', verbose_name="Контейнер по умолчанию")
    #иконка
    icon = models.ForeignKey(Icon, null=True,  blank=True, verbose_name="Иконка")
    #порядок сортировки
    sort = models.IntegerField(blank=True, default=10, verbose_name="Порядок сортировки")
    #Флаг категории
    category = models.BooleanField(verbose_name="Это категория")
    #Принадлежность к категории
    parent = models.ForeignKey('self', null=True, blank=True, related_name = 'mt_parent_set', verbose_name="Принадлежность к категории")
    #Строка шаблона импорта имени
    import_title = models.CharField(max_length=256, verbose_name="Строка шаблона импорта имени")
    #Строка шаблона импорта серийника
    import_serialnumber = models.CharField(max_length=256, blank=True, verbose_name="Строка шаблона импорта серийника")
    #Расходный материал
    rashodnik  = models.BooleanField(verbose_name="Расходный материал")
    #Фиктивное устройство
    virtual = models.BooleanField(verbose_name="Фиктивное устройство")
    #Имеет инвентарный номер
    have_inventory_number = models.BooleanField(verbose_name="Имеет инвентарный номер")
    #Внешнее устройство
    peripheral = models.BooleanField(verbose_name="Внешнее устройство")
    #может содержать комплектующие
    container = models.BooleanField(verbose_name="Может содержать комплектующие")
        #подлежит профилактике 
    can_maintenance  = models.BooleanField(verbose_name="Подлежит профилактике")
        #подлежит инвентаризации
    can_inventory = models.BooleanField(verbose_name="Подлежит инвентаризации")
    maintenance_period = models.DecimalField(max_digits=4, decimal_places=1, verbose_name="Периодичность профилактического обслуживания")
    depreciation_period = models.DecimalField(max_digits=4, decimal_places=1, verbose_name="Срок амортизации")
    
    class Meta:
        verbose_name = "Тип модели"
        verbose_name_plural = "Типы моделей"        
        
    def __unicode__(self):
        return u"%s" % self.title
 
 
 
# Модель
class DeviceModel(models.Model):
    
    modeltype = models.ForeignKey(ModelType, verbose_name="Тип устройства") # Тип устройства (FK)
    title = models.CharField(max_length=128, verbose_name="Наименование")#наименование
    title_buch = models.CharField(max_length=64, blank=True, verbose_name="Наименование по бухгалтерии")#Наименование по бухгалтерии
    
    #manufacturer = models.CharField(max_length=128, blank=True, verbose_name="Производитель")#Производитель
    manufacturer = models.ForeignKey(Manufacturer, verbose_name="Производитель")
    
    photo = models.ForeignKey(Photo, null=True,  blank=True, verbose_name="Фотографии")
    link_model = models.URLField(verify_exists=False, verbose_name="ссылка на модель")#ссылка на модель
    link_drivers = models.URLField(verify_exists=False, verbose_name="ссылка на дрова")#ссылка на дрова 
    peripheral = models.BooleanField(verbose_name="Внешнее устройство")#Внешнее устройство
    have_capacity = models.BooleanField(verbose_name="Имеет емкость")
    capacity = models.IntegerField(blank=True, default=0, verbose_name="Емкость")
    have_netport = models.BooleanField(verbose_name="Имеет сетевые порты")
    netport = models.IntegerField(blank=True, default=0, verbose_name="Сетевые порты")

    class Meta:
        verbose_name = "Модель"
        verbose_name_plural = "Модели"
        
    def __unicode__(self):
        return u"%s" % self.title 

      
        
# Устройство
class Device(models.Model):
    
    devicemodel = models.ForeignKey(DeviceModel, verbose_name="Модель")# Модель (FK)
    modeltype = models.ForeignKey(ModelType, verbose_name="Тип устройства") # Тип устройства (FK)
    parent = models.ForeignKey('self', null=True, blank=True, related_name = 'dev_parent_set', verbose_name="Принадлежность к контейнеру")
    workstation = models.ForeignKey(Workstation, verbose_name="Рабочее место")  #Рабочее место (FK)
    photo = models.ForeignKey(Photo, null=True,  blank=True, verbose_name="Фотографии")#фотографии (FK)
    devicestate = models.ForeignKey(DeviceState, null=True,  blank=True, verbose_name="Состояние")#Состояние (FK)
    #
    serial_hardware = models.CharField(max_length=24, blank=True, verbose_name="Аппаратный серийный номер")#Аппаратный серийный номер
    serial_visual = models.CharField(max_length=24, blank=True, verbose_name="Визуальный серийный номер") #Визуальный серийный номер
    inventory_number = models.CharField(max_length=24, blank=True, verbose_name="Инвентарный номер")#Инвентарный номер (бух)
    passport_number = models.CharField(max_length=24, blank=True, verbose_name="Номер паспорта")#Номер паспорта
    barcode = models.CharField(max_length=24, blank=True, verbose_name="Штрих-код") #Штрих-код

 
    class Meta:
        verbose_name = "Устройство"
        verbose_name_plural = "Устройства"        
        
    def __unicode__(self):
        return u"%s" % self.title                  
        
        
         
# Описание дополнительных параметров моделей и устройств
class ModelTypeParam(models.Model):
    # Тип устройства (FK)
    modeltype = models.ForeignKey(ModelType, verbose_name="Тип устройства")         
    #наименование
    title = models.CharField(max_length=128, verbose_name="Наименование")
    #Строка шаблона импорта параметра
    import_str = models.CharField(max_length=256, verbose_name="Строка шаблона импорта")
    #Тип параметра (Модель, Устройство)  
    type = models.CharField(max_length=6, choices=PARAM_TYPE_CHOICES, verbose_name='Тип параметра', default=None)  
    
    class Meta:
        verbose_name = "Описание дополнительных параметров"
        verbose_name_plural = "Описание дополнительных параметров"        
        
    def __unicode__(self):
        return u"%s - %s" % (self.title, self.import_str)  
          
               
            
# Доп параметры устройства
class DeviceParam(models.Model):
    #Устройство (FK)
    device = models.ForeignKey(Device, verbose_name="Устройство") 
    #Описание доп параметров устройств (FK)
    modeltypeparam = models.ForeignKey(ModelTypeParam, verbose_name="Описание доп параметров устройств") 
    #наименование
    title = models.CharField(max_length=128, verbose_name="Наименование")
    #значение    
    value = models.CharField(max_length=128, verbose_name="Значение")    
    
    class Meta:
        verbose_name = "Параметры устройства"
        verbose_name_plural = "Параметры устройства"
        
    def __unicode__(self):
        return u"%s=%s" % (self.title, self.value)     



# Доп параметры моделей 
class ModelParam(models.Model):
    #Устройство (FK)
    devicemodel = models.ForeignKey(DeviceModel, verbose_name="Модель")
    #Описание доп параметров устройств (FK)
    modeltypeparam = models.ForeignKey(ModelTypeParam, verbose_name="Описание доп параметров устройств") 
    #наименование
    title = models.CharField(max_length=128, verbose_name="Наименование")
    #значение    
    value = models.CharField(max_length=128, verbose_name="Значение")   
    
    class Meta:
        verbose_name = "Параметры моделей"
        verbose_name_plural = "Параметры моделей"
        
    def __unicode__(self):
        return u"%s=%s" % (self.title, self.value)        
        
        
   

 
        
# Правила импорта      
'''            
            Название проги (FK)
            Тип устройства (FK) 
            параметр  
            шаблон в конфиге
'''            
            
# Тип импорта сканирования HW
'''            
            название проги 
'''            
            
# Конфиги сканирования    
'''        
            Название проги (FK)
            #Устройство (FK)
            Рабочее место(FK)
            текст файла отчета
'''        
        

# Причины перемещения
class MoveReason(models.Model):     
    #Наименование
    name = models.CharField(max_length=128, verbose_name="Наименование")
    #Описание
    description = models.CharField(max_length=256, verbose_name="Описание")
    #Примечание
    note = models.CharField(max_length=256, blank=True, verbose_name="Примечание")
    
    class Meta:
        verbose_name = "Причины перемещения"
        verbose_name_plural = "Причины перемещения"
        
    def __unicode__(self):
        return u"%s" % name  
       
       
       
       
# История перемещения устройств
class MoveHistory(models.Model):      
    #Устройство (FK)  
    device = models.ForeignKey(Device, verbose_name="Устройство")   
    #Рабочее место старое (FK)
    workstation_old = models.ForeignKey(Workstation, related_name = 'mh_old_set', verbose_name="Рабочее место" )
    #Рабочее место новое (FK)
    workstation_new = models.ForeignKey(Workstation, related_name = 'mh_new_set', verbose_name="Рабочее место")
    #Дата
    data = models.DateTimeField(auto_now_add=True, verbose_name="Дата")
    #Сотрудник выполнивший перемещение (FK)
    employee = models.ForeignKey(Employee, verbose_name='Сотрудник выполнивший перемещение')
    #Причина            
    movereason = models.ForeignKey(MoveReason, verbose_name="")   
           
    
    class Meta:
        verbose_name = "История перемещения устройств"
        verbose_name_plural = "История перемещения устройств"        
        
    def __unicode__(self):
        return u"%s" % data  


# Типы обслуживания устройств
class WorkType(models.Model):

    #Наименование
    name = models.CharField(max_length=64, verbose_name="Наименование")
    #Кратко
    name_short = models.CharField(max_length=64, blank=True, verbose_name="Наименование краткое")     
    #Описание
    description = models.CharField(max_length=256, verbose_name="Описание")
    #Цена
    price = models.DecimalField(max_digits=8, decimal_places=2, verbose_name="Цена")
    #Порофилактическое обслуживание
    prev_maintenance = models.BooleanField(verbose_name="Порофилактическое обслуживание")
    #Примечание
    note = models.CharField(max_length=256, verbose_name="Примечание")
    
    class Meta:
        verbose_name = "Тип обслуживания устройств"
        verbose_name_plural = "Типы обслуживания устройств"

        
    def __unicode__(self):
        return u"%s" % name      
      
     
# Журнал обслуживания устройств
class MaintenanceHistory(models.Model):
    #Устройство (FK)
    device = models.ForeignKey(Device, verbose_name="Устройство")    
    #Заявка (FK)
    task = models.ForeignKey(Task, null=True,  blank=True,  verbose_name="Заявка")    
    #Вид работы
    worktype = models.ForeignKey(WorkType, verbose_name="Вид работы")   
    #Сотрудник выполнивший работу (FK)
    employee = models.ForeignKey(Employee, verbose_name='Сотрудник выполнивший работу')
    #Дата
    data = models.DateTimeField(auto_now_add=True, verbose_name="Дата")


    class Meta:
        verbose_name = "История обслуживание устройства"
        verbose_name_plural = "История обслуживания устройств"

        
    def __unicode__(self):
        return u"%s" % self.data  
      

   
            
# Причины списания
'''            
            Наименование
            Примечание
'''
         
          

# типы обслуживания рабочих мест
'''
            Наименование
            Кратко
            Цена
            Порофилактическое обслуживание
            Примечание
'''    
        
# Типы обслуживания лицензий(ПО) 
'''
            Наименование
            Кратко
            Цена
            Порофилактическое обслуживание
            Примечание
'''

          
            